package com.atguigu.recursion;

/**
 * @author durant
 * @create 2021-11-13 16:05
 */
public class Queen8 {
    // 定义一个max表示有多少个皇后
    int max = 8;
    static int count=0;
    int[] array= new int[max];
    public static void main(String[] args) {
        Queen8 queen8=new Queen8();
        queen8.check(0);
        System.out.println("一共有："+count+"解法");
    }
    private void check(int n){
        // n代表第几行，
        // i代表第几列
        if ( n == max){
            //表示n=8，其实已经放了8个皇后，因为是从0 开始的
            show();
            return;
        }
        // 依次放入皇后，并判断是否冲突
        for (int i = 0; i < max; i++) {
            array[n] = i;
            if (judge(n)){//不冲突
                // 接着 放n+1个皇后，即开始递归
                check(n+1);

            }
            // 如果冲突，就继续执行
        }
    }
    // 查看当我们放置第n个皇后时，就去检测该皇后与前面的皇后是否冲突
    /*
     *@Description
     *@param n 表示几个皇后
     *@return
     *@Author Mr.Durant
     *@Date 2021/11/13
     *@Time 16:25
     */
    private boolean judge(int n){
        for (int i = 0; i < n; i++) {
            // 第一个判断如果相等，表明在同一列上
            //Math.abs(n-i) == Math.abs(array[n] - array[i]) 是判断在一条斜线上
            //  判断是否在同一行没有必要，因为n在递增
            if (array[i] == array[n] || Math.abs(n-i) == Math.abs(array[n] - array[i])){
                return false;
            }
        }
        return true;

    }
    private void show(){
        count++;
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i]+" ");
        }
        System.out.println();
    }
}
